home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / dns_fingerprint.nasl < prev    next >
Text File  |  2005-01-14  |  11KB  |  285 lines

  1. #
  2. # (C) Tenable Network Security
  3. #
  4. #
  5. # This script is a very crude attempt at doing DNS fingerprinting
  6. #
  7. #
  8. #
  9. #
  10.  
  11. if(description)
  12. {
  13.  script_id(11951);
  14.  script_version ("$Revision: 1.36 $");
  15.  
  16.  
  17.  name["english"] = "DNS Server Fingerprint";
  18.  script_name(english:name["english"]);
  19.  
  20.  desc["english"] = "
  21. This script attempts to identify the remote DNS server type and version
  22. by sending various invalid requests to the remote DNS server and analyzing
  23. the error codes returned.
  24.  
  25. See also : http://cr.yp.to/surveys/dns1.html
  26. Risk factor : None";
  27.  
  28.  
  29.  
  30.  script_description(english:desc["english"]);
  31.  
  32.  summary["english"] = "detects a name server type and version";
  33.  script_summary(english:summary["english"]);
  34.  
  35.  script_category(ACT_GATHER_INFO);
  36.  
  37.  script_copyright(english:"This script is Copyright (C) 2003 Tenable Network Security");
  38.  family["english"] = "General";
  39.  script_family(english:family["english"]);
  40.  
  41.  exit(0);
  42. }
  43.  
  44.  
  45. include("misc_func.inc");
  46. include("global_settings.inc");
  47.  
  48. id = rand() % 1024;
  49. TIMEOUT = 5;
  50.  
  51. timeouts = 0;
  52.  
  53.  
  54. function probe(message)
  55. {
  56.  local_var soc, num_responses, rcode, sig;
  57.  
  58.  soc = open_sock_udp(53);
  59.  send(socket:soc, data:message);
  60.  r = recv(socket:soc, length:4096); 
  61.  close(soc);
  62.  if ( ! r ) 
  63.  {
  64.   timeouts ++;
  65.   if ( timeouts > 3 && !thorough_tests)
  66.   {
  67.      if ( report_verbosity < 2 ) exit(0);
  68.     else {
  69.      report = "The remote name server could not be fingerprinted (too many itimeouts)";
  70.      security_note(port:53, proto:"udp", data:report);
  71.      exit(0);
  72.     }
  73.    }
  74.   return "t:";
  75.  }
  76.  
  77.  
  78.  rcode = substr(r, 3, 3);
  79.  rcode = ord(rcode) & 0x0f;
  80.  
  81.  sig = string(rcode);
  82.  if ( ord(r[2]) & TC_BIT ) sig += "TC";
  83.  if ( ord(r[2]) & RD_BIT ) sig += "RD";
  84.  if ( ord(r[2]) & AA_BIT ) sig += "AA";
  85.  if ( ord(r[3]) & Z0_BIT ) sig += "Z0";
  86.  if ( ord(r[3]) & Z1_BIT ) sig += "Z1";
  87.  if ( ord(r[3]) & Z2_BIT ) sig += "Z2";
  88.  
  89.  if ( ord(r[5]) == 0 ) sig += "q";
  90.  if ( ord(r[5]) > 1  ) sig += "Q2";
  91.  
  92.  if ( ord(r[5]) ) {
  93.     a = substr(r, strlen(r) - 4, strlen(r) - 1);
  94.     b = substr(message, strlen(message) - 4, strlen(message) - 1);
  95.     if ( a != b ) sig += "X";
  96.     }
  97.  
  98.  
  99.  if ( ord(r[7]) != 0 ) sig += "D";
  100.  
  101.  sig += ":";
  102.  return sig;
  103. }
  104.  
  105. RD_BIT = 1;
  106. TC_BIT = 2;
  107. AA_BIT = 4;
  108. Z0_BIT = 16;
  109. RCODE15 = 15;
  110. Z1_BIT = 32;
  111. Z2_BIT = 64;
  112. OPCODE2= 16;
  113. OPCODE3= 24;
  114. OPCODE6= 48;
  115.  
  116. i = 0;
  117. nessus_example_com = raw_string(6) + "nessus" + raw_string(7) + "example" + raw_string(3) +"com";
  118.  
  119. test = probe(message:raw_string(0,0,0,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1));
  120. if ( "t:" >< test ) exit(0); 
  121.  
  122. probes[i++] = raw_string(0,0,8,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  123. probes[i++] = raw_string(0,0,0,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,3);
  124. probes[i++] = raw_string(0,0,0,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,63);
  125. probes[i++] = raw_string(0,0,0,0,0,2,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1,0,0,16,0,1);
  126. probes[i++] = raw_string(0,0,32,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  127. probes[i++] = raw_string(0,0,40,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  128. probes[i++] = raw_string(0,0,0,0,0,0,0,0,0,0,0,0);
  129. probes[i++] = raw_string(0,0,0,0,0,1,0,0,0,0,0,0,6);
  130. probes[i++] = raw_string(0,0,0,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0);
  131. probes[i++] = raw_string(0,0,TC_BIT,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  132. probes[i++] = raw_string(0,0,0,0,0,1,0,0,0,0,0,0, 7) + "AUTHORS" + raw_string(4) +"BIND" + raw_string(0,0,16,0,3);
  133. probes[i++] = raw_string(0,0,AA_BIT,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  134. probes[i++] = raw_string(0,0,0,RCODE15,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  135. probes[i++] = raw_string(0,0,0,Z0_BIT,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  136. probes[i++] = raw_string(0,0,0,Z1_BIT,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  137. probes[i++] = raw_string(0,0,0,Z2_BIT,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  138. probes[i++] = raw_string(0,0,OPCODE2,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  139. probes[i++] = raw_string(0,0,OPCODE3,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  140. probes[i++] = raw_string(0,0,OPCODE6,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  141. probes[i++] = raw_string(0,0,0,0,0,1,0,0,0,0,0,0) + nessus_example_com + raw_string(0,0,16,0,1);
  142. probes[i++] = raw_string(0,0,0,0,0,1,0,0,0,0,0,0,21) + "erre-con-erre-cigarro" + raw_string(7) + "maradns" + raw_string(3) + "org" + raw_string(0,0,16,0,1);
  143. probes[i++] = raw_string(0,0,0,0,0,1,0,0,0,0,0,0,7) + "version" + raw_string(6) + "server" + raw_string(0,0,16,0,3);
  144. probes[i++] = raw_string(0,0,0,0,0,1,0,0,0,0,0,0,7) + "VERSION" + raw_string(4) + "BIND" +raw_string(0,0,16,0,3);
  145.  
  146.  
  147. fingerprint = "";
  148.  
  149. for ( i = 0 ; probes[i] ; i ++ )
  150. {
  151.  fingerprint += probe(message:probes[i]);
  152. }
  153.  
  154. if (COMMAND_LINE) display("Fingerprint= ",fingerprint, "\n");
  155.  
  156. db = "
  157. dnsmasq 1.13:5:5:5:5Q2:5:5:5q:t:t:5:5:5:5:5Z0:5Z1:5Z2:5:5:5:5:5:5:5:
  158. Efficient Networks Routers Internal DNS Server:4q:2:2:1q:2:1q:1q:1q:1q:1q:2:0X:0X:0X:0Z0X:0X:0X:0X:0Z2X:4q:0X:4q:0X:
  159. ISC BIND 4.9 + OpenBSD patches:1q:2:2:1q:4q:4q:1q:1q:1q:0TC:2:0X:0X:0Z0X:0Z1X:0Z2X:4q:4q:4q:0X:0X:2:2:
  160. ISC BIND 8.1:1q:2:2:1q:2:1q:1q:1X:1:0TC:2:0X:0X:0Z0X:0Z1X:0Z2X:4q:4q:4q:0X:0X:2:0AAXD:
  161. # Below is actually Bind 8.1.2
  162. ISC BINS 8.1:1q:2:2:1q:5:1q:1q:1X:1:0TC:2:0X:0X:0Z0X:0Z1X:0Z2X:4q:4q:4q:0X:0X:2:0AAXD:
  163. # Bind 8.1.2 on Solaris
  164. ISC BIND 8.1:1q:0:0:1q:5:1q:1q:1q:1q:0TC:0:0:0:0Z0:0Z1:0Z2:4q:4q:4q:0:0:0:0AAXD:
  165.  
  166. ISC BIND 8.2:4q:5:5:1q:2:1q:1q:1q:1q:0X:5:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:0AAXD:
  167. # net-dns/bind-9.2.2-r3 on Gentoo 1.4
  168. ISC BIND 9.2.2:4q:5:5:1q:2:1q:1q:1q:1q:0X:5:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:0AAXD:
  169. # Below is actually BIND 8.2-6 (RedHat RPM)
  170. ISC BIND 8.2:1q:2:2:1q:2:1q:1q:1X:1:0TC:2:0X:0X:0Z0X:0X:0Z2X:4q:4q:4q:0X:0X:2:0AAXD:
  171. ISC BIND 8.3:1q:2:2:1q:2:1q:1q:1q:1q:0TC:2:0X:0X:0Z0X:0X:0Z2X:4q:4q:4q:0X:0X:2:0AAXD:
  172. # Below is actually Bind 8.3.6
  173. ISC BIND 8.3:1q:5:5:1q:2:1q:1q:1q:1q:5TC:5:5:5:5Z0:5Z1:5Z2:4q:4q:4q:5:5:5:5:
  174. ISC BIND 8.4:1q:2:2:1q:2:1q:1q:1q:1q:0TC:2:0X:0X:0Z0X:0X:0Z2X:4q:4q:4q:0X:0X:2:0AAXD:
  175. # BIND 9.1.3 actually
  176. ISC BIND 9.1:4q:5:5:1q:5:1q:1q:1q:1q:0X:0AAXD:0X:15X:0X:0X:0X:4q:4q:4q:0X:0X:5:0AAXD:
  177. ISC BIND 9.2.1:4q:5:5:1q:2:1q:1q:1q:1q:0X:0X:0AAXD:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:0AAXD:
  178. ISC BIND 9.2.1:4q:5:5:1q:2:1q:1q:1q:1q:0X:0AAXD:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:0AAXD:
  179. ISC BIND 9.2.1:4q:5:5:1q:2:1q:1q:t:t:0X:5:0X:0X:0X:0X:0X:4q:4q:t:0X:0X:5:0AAXD:
  180. ISC BIND 9.2.1:4q:5:5:1q:2:1q:1q:1q:1q:0X:0AAXD:0X:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:
  181. ISC BIND 9.2.2rc1:4q:5:5:1q:2:1q:1q:1q:1q:5:0AAXD:5:5:5:5:5:4q:4q:4q:5:5:5:0AAXD:
  182. ISC BIND 9.2.2:4q:5:5:1q:5:5q:1q:1q:1q:5:0AAXD:5:5:5:5:5:4q:4q:4q:5:5:5:0AAXD:
  183. ISC BIND 9.2.2:4q:5:5:1q:2:1q:1q:1q:1q:0X:0AAXD:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:0AAXD:
  184. ISC BIND 9.2.3:4q:5:5:1q:1:1q:1q:1q:1q:0X:0AAXD:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:0AAXD:
  185. ISC BIND 9.2.3:4q:5:5:1q:1:1q:t:1q:1q:0X:0AAXD:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:0AAXD:
  186. ISC BIND 9.2.3:4q:2:5:1q:1:1q:1q:1q:1q:0X:0AAXD:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:2:0AAXD:
  187. ISC BIND 9.2.3:4q:5:5:1q:1:1q:1q:1q:1q:0X:5:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:0AAXD:
  188. ISC BIND 9.2.3:4q:5:5:1q:1:1q:1q:1q:1q:0X:5:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:5:5:
  189. ISC BIND 9.2.3:4q:2:5:1q:1:1q:1q:1q:1q:0X:3AAX:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:2:3AAX:
  190. # bind-9.3.0-0.beta2.1mdk
  191. ISC BIND 9.3.0:4q:2:5:1q:1:1q:t:1q:1q:0X:0AAXD:0X:0X:0X:0X:0X:4q:4q:4q:0X:0X:2:0AAXD:
  192. # Indeed MaraDNS 1.0.20
  193. MaraDNS 1.0:4q:5q:5q:t:4q:4q:4q:t:t:5q:5q:5q:5q:5q:5q:5q:4q:4q:4q:5q:2q:5q:5q:
  194. # MaraDNS 0.9.15-1
  195. MaraDNS 0.9:4q:5q:5q:4q:4q:4q:4q:t:t:5q:5q:5q:5q:5q:5q:5q:4q:4q:4q:5q:2q:5q:5q:
  196. Microsoft Windows NT 4 Name Server:1:4:4:1Q2:t:4:4X:1q:0X:4X:0TCX:4X:0X:15X:0Z0X:0X:4:4:4:0X:0X:4:4:
  197. Microsoft Windows 2000 Name Server:1:4:4:1Q2:t:4:1q:0X:0X:0TCX:4:0X:15X:0Z0X:0X:0X:4:4:4:0X:0X:4:4:
  198. Microsoft Windows 2000 Name Server:1q:2:2:1q:2:1q:1q:1q:1q:0TC:5:0X:0X:0Z0X:0X:0Z2X:4q:4q:4q:0X:0X:2:5
  199. Microsoft Windows 2003 Name Server:4:4:4:1Q2:t:1:1q:1:0X:0X:4:0X:15X:0X:0X:0X:4:4:4:0X:2:4:4:
  200. Microsoft Windows 2003 Name Server:4:4:4:1Q2:t:1:1:q:1:2:2:4:2:2:2:2:2:4:4:4:2:2:4:4:
  201. Microsoft Windows 2003 Name Server:4:4:4:1Q2:t:1:1q:1:0X:0X:4:0X:15X:0X:0X:0X:4:4:4:0X:0X:4:4:
  202. Microsoft Windows 2003 Name Server:4:4:4:1Q2:t:1:1q:1:4:0X:4:0X:15X:0X:0X:0X:4:4:4:0X:0X:4:4:
  203. Microsoft Windows 2003 Name Server:4:4:4:1Q2:t:1:1q:1:2:2:4:2:2:2:2:2:4:4:4:2:2:4:4:
  204. Microsoft Windows 2003 Name Server:4:4:4:1Q2:t:1:1q:t:t:0X:4:0X:15X:0X:0X:0X:4:4:4:0X:2:4:4
  205. Microsoft Windows 2003 Name Server:4:4:4:1Q2:t:1:1q:1:2:2:4:2:2:2:2:2:4:4:4:2:2:4:4:
  206. Microsoft Windows 2003 Name Server:4:4:4:1Q2:t:1:1q:1:4:3AAX:4:3AAX:3AAX:3AAX:3AAX:3AAX:4:4:4:3AAX:3AAX:4:4:
  207. mydns v0.10.0:4q:4q:4q:1q:4q:4q:1q:1q:1q:1TCq:4q:5:5:5:5:5:4q:4q:4q:5:5:4q:4q:
  208. mydns v0.10.1:4q:4q:4q:1q:4q:4q:1q:1q:1q:1TCq:4q:5AA:5:5:5Z1:5Z2:4q:4q:4q:5:5:4q:4q:
  209. PowerDNS 2.9.13:2:2X:2X:2:2:2:t:t:t:2:0AA:2:2:2:2:2:2:2:2:2:2:0AA:0AA:
  210. # pdnsd 1.1.7 -  http://home.t-online.de/home/Moestl/
  211. pdnsd 1.1:4q:4:4:3Q2:4q:4q:1q:1q:1q:3:4:3:t:1q:3:1q:4q:4q:4q:3:0:4:4:
  212. pdnsd 1.1.8:4q:4:4:3Q2:4q:4q:1q:1q:1q:3:4:3:t:1q:3:1q:4q:4q:4q:3:0XD:4:4:
  213. pdnsd 1.1.8:4q:4:4:2Q2:4q:4q:1q:1q:1q:2:4:2:t:1q:2:1q:4q:4q:4q:2:2:4:4:
  214.  
  215.  
  216. ";
  217.  
  218.  
  219. m = egrep(pattern:fingerprint, string:db);
  220. if ( m )
  221. {
  222.  m = split(m);
  223.  dns = NULL;
  224.  num = 0;
  225.  foreach line (m)
  226.  {
  227.  n = split(line, sep:":", keep:FALSE);
  228.  dns += n[0] + '\n';
  229.  num ++;
  230.  }
  231.  
  232.  if ( num == 1 )report = "The remote name server could be fingerprinted as being : " + dns;
  233.  else report = 'The remote name server could be fingerprinted as being one of the following :\n' + dns;
  234.  security_note(port:53, proto:"udp", data:report);
  235.  exit(0);
  236. }
  237.  
  238.  
  239. results = split(fingerprint, sep:":", keep:0);
  240. db = egrep(pattern:"^[^#].*", string:db);
  241. foreach sig (split(db))
  242.   {
  243.    sig = sig - '\n';
  244.    if ( strlen(sig) > 1 )
  245.    {
  246.     v = split ( sig, sep:":", keep:0);
  247.     n = max_index(v);
  248.     dns = v[0];
  249.     diff = 0;
  250.     for ( i = 1 ; i < n ; i ++ )
  251.     if ( v[i] != results[i - 1] ) diff ++;
  252.   
  253.     differences[dns] = diff;
  254.    }
  255.   }
  256.  
  257. m = 99999;
  258. foreach d (differences) if (d < m) m = d;
  259.  
  260. if ( m < 10 )
  261.  {
  262.     dns = NULL;
  263.     foreach i (keys(differences))
  264.     {
  265.      if ( differences[i] == m )
  266.      {
  267.       if ( ! dns ) dns = i;
  268.       else dns += '\n' + i;
  269.      }
  270.     }
  271.    report = '
  272. Nessus was not able to reliable identify the remote DNS server type.
  273. It might be :\n' + dns + '\nThe fingerprint differs from these known signatures on ' + m + ' points.\n' + 'If you know which DNS server this host is actually running, please send this signature to \n' +
  274. 'dns-signatures@nessus.org : \n' + fingerprint;
  275.   security_note(port:53, proto:"udp", data:report);
  276.   exit(0);
  277. }
  278.  
  279.  security_note(port:53, proto:"udp", data:"It was not possible to fingerprint the remote DNS server.
  280.  
  281. If you know the type and version of the remote DNS server, please send 
  282. the following signature to dns-signatures@nessus.org :
  283. " + fingerprint);
  284.  
  285.